package testcl;

import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import testcl.comp.TComponent;

/**
 *
 * @author Bogdan Moza
 */
public class Main
{
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            // directorul unde se găsesc clasele ce urmează să fie încărcate
            File compDir = new File("components/");
            //numele pachetului
            String packageName = TComponent.class.getPackage().getName();

            // loaderul de clase customizat
            CustomClassLoader ccl = new CustomClassLoader(compDir.getAbsolutePath(), packageName);

            for (File file : compDir.listFiles()) {
                if (file.isFile()) {
                    if (file.getName().endsWith(".class")) {
                        System.out.println("Loading: " + file.getName());

                        /**
                         * className-ul care îl primeşte CustomClassLoader trebuie
                         *  să fie de tipul „fully qualified class name” din cauza
                         *  asta adăugăm numele pachetului înaintea filename-ului
                         */
                        Class loadedClass = ccl.loadClass(packageName + "." + file.getName().replace(".class", ""));
                        Object obj = loadedClass.newInstance();

                        // toate clasele load-uite implementează interfaţa TComponent
                        TComponent loadedComponent = (TComponent) obj;
                        // apelarea metodei puse la dispoziţie de TComponent
                        loadedComponent.doAction();
                    }
                }
            }


        }
        catch (ClassNotFoundException ex) {
            logException(ex);
        }
        catch (InstantiationException ex) {
            logException(ex);
        }
        catch (IllegalAccessException ex) {
            logException(ex);
        }
    }

    private static void logException(Exception ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
}
